#include "../include/rpc_server.h"

#include <muduo/net/EventLoop.h>
#include <muduo/base/Logging.h>
#include <iostream>
#include <nlohmann/json.hpp>

// 记录收到的RPC请求日志
void LogRequest(const std::string& method, const nlohmann::json& params) {
	// muduo 库自带日志库记录请求信息 方法名和参数
	LOG_INFO << "Received RPC request for method: " << method << " with params: " << params.dump(); 
}

// 给客户端的响应日志
void LogResponse(const std::string& method, const nlohmann::json& response) {
	// 同上，只是记录的信息不同 都是日志库
	LOG_INFO << "Responding to method: " << method << " with ans: " << response.dump();
}

// 最终的总和  个人习惯就是main只来调用封装好的test 易于调试
void test() {
	muduo::net::EventLoop loop;
	// RPC 服务器  8888端口
	// explicit muduo::net::InetAddress::InetAddress(uint16_t port = (uint16_t)0U, bool loopbackOnly = false, bool ipv6 = false)
	scRpc::RpcServer server(&loop, muduo::net::InetAddress(8888));

	// 注册 加法服务 方法  add
	// 后面的 std::function<nlohmann::json (const nlohmann::json &)> handler 是一个lambda
	server.RegisterHandler("add", [](const nlohmann::json& params) {
		// 收到的请求
		LogRequest("add", params);
		// 给校验  [数组 两个元素]
		if (!params.is_array() || params.size() != 2) {
			// 就是无效 给错误提示
			nlohmann::json error_response;
			error_response["error"] = "Invalid parameters for add";		// 添加参数无效
			return error_response;
		}
		// 没进if 就是加法操作
		int ans = params[0].get<int>() + params[1].get<int>();

		// 临时响应对象 给加法结果
		nlohmann::json response;
		response["ans"] = ans;

		// 记录一下响应日志
		LogResponse("add", response);
		return response;
	});

	// 注册 字符串拼接服务 方法 concat
	server.RegisterHandler("concat", [](const nlohmann::json& params) {
		// 收到的请求
		LogRequest("concat", params);
		// 给校验  [数组 两个元素]
		if (!params.is_object() || !params.contains("str1") || !params.contains("str2")) {
			// 就是无效 给错误提示
			nlohmann::json error_response;
			error_response["error"] = "Invalid parameters for concat";		// 添加参数无效
			return error_response;
		}
		// 没进if 就是加法操作
		std::string ans = params["str1"].get<std::string>() +  params["str2"].get<std::string>();

		// 临时响应对象 给加法结果
		nlohmann::json response;
		response["ans"] = ans;

		// 记录一下响应日志
		LogResponse("concat", response);
		return response;
	});

	// 参考上面形式
	// 注册其他服务或处理函数时，可以按如下方式添加：
    // server.RegisterHandler("anotherMethod", [](const nlohmann::json& params) { ... });

	// 监听请求 启动RPC
	server.start();

	// 给控制台提示信息
	std::cout << "RPC Server started on port 8888" << std::endl;
	// 事件循环 优化一波
	loop.loop();
}

int main() {
	// 调用test
	test();
	return 0;
}
